/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.brain.core.view.mbean;

import com.brain.core.common.UtilCore;
import com.brain.core.dto.ParametroDto;
import com.brain.core.dto.TipoCambioDetaDto;
import com.brain.core.dto.TipoCambioDto;
import com.brain.core.exception.DAOException;
import com.brain.core.manager.RecursosManager;
import com.brain.core.manager.TipoCambioDetaManager;
import com.brain.core.manager.TipoCambioManager;
import com.brain.core.view.util.ConstantesCore;
import java.io.Serializable;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;

import javax.annotation.Resource;
import javax.faces.event.ActionEvent;
import javax.faces.model.SelectItem;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

@Controller("tipoCambioMBean")
@Scope("session")
public class TipoCambioMBean extends GenericMBean implements Serializable {

    private static Logger logger = Logger.getLogger(TipoCambioMBean.class);
    @Resource
    private TipoCambioManager manager;
    @Resource
    private TipoCambioDetaManager mngDeta;
    @Resource
    private RecursosManager recursosManager;
    private List<TipoCambioDto> lista;
    private TipoCambioDto dto;
    private TipoCambioDto dtoFiltro;
    private String keyTitulo = "tipo.cambio.panel";
    private int accionTipoCambio;
    private TipoCambioDetaDto tipoCambioDetaDto;
    private List<ParametroDto> listaTipos;
    private List<ParametroDto> listaMonedas;
    private SelectItem[] siTiposCambio;
    private ParametroDto monedaBaseDto;
    private ParametroDto monedaCambioDto;
    private BigDecimal factorConversion;
    @Autowired
    private ApplicationMBean applicationMBean;
    @Autowired
    private SessionMBean sessionMBean;

    public TipoCambioMBean() {
        //sessionMBean.setAccion(ConstantesWeb.Formulario.LISTA);
        //sessionMBean.setTitulo(recursosManager.construirTitulo(keyTitulo, sessionMBean.getAccion()));        
        this.dtoFiltro = new TipoCambioDto();

    }
    
     public String iniciar () {
        this.lista = null;     
        this.dto = null;
       this.dtoFiltro = new TipoCambioDto();       
        return ConstantesCore.UrlNavegacion.URL_LISTA_TIPOS_CAMBIO;
    }

    public String nuevo() {
        sessionMBean.setAccion(ConstantesCore.Formulario.NUEVO);
        sessionMBean.setTitulo(recursosManager.construirTitulo(keyTitulo, sessionMBean.getAccion()));
        this.dto = new TipoCambioDto();

        return ConstantesCore.UrlNavegacion.URL_TIPO_CAMBIO;
    }

    public void inicializarTipoCambioDeta() {
        this.tipoCambioDetaDto = new TipoCambioDetaDto();
        this.tipoCambioDetaDto.setMonedaDto(this.monedaBaseDto);
        this.tipoCambioDetaDto.setFactor(BigDecimal.ONE);
        this.tipoCambioDetaDto.setComentario("");
    }

    public String editar() {
        sessionMBean.setAccion(ConstantesCore.Formulario.EDITAR);
        sessionMBean.setTitulo(recursosManager.construirTitulo(keyTitulo, sessionMBean.getAccion()));


        monedaBaseDto = this.recursosManager.obtenerParametroPorID(ConstantesCore.ValoresDefecto.MONEDA_DEFECTO);
        if (this.dto.getTiposCambioDetaDto() == null) {
            this.dto.setTiposCambioDetaDto(new ArrayList<TipoCambioDetaDto>());
        }
        inicializarTipoCambioDeta();
        return ConstantesCore.UrlNavegacion.URL_TIPO_CAMBIO;
    }

    public String ver() {
        sessionMBean.setAccion(ConstantesCore.Formulario.VER);
        sessionMBean.setTitulo(recursosManager.construirTitulo(keyTitulo, sessionMBean.getAccion()));
        return ConstantesCore.UrlNavegacion.URL_TIPO_CAMBIO;
    }

    public void buscar(ActionEvent ae) {        
        Map<String, Object> mapFiltro = new HashMap<String, Object>();
        
        mapFiltro.put("organizacionDto.id", this.sessionMBean.getSessionOrganizacionDto().getId());
        
        if (this.dtoFiltro.getId() != null && !this.dtoFiltro.getId().equals(0L)) {
            mapFiltro.put("id", this.dtoFiltro.getId());
        } else {
            this.dtoFiltro.setId(null);
        }

        if (this.dtoFiltro.getFechaCambio() != null) {
            mapFiltro.put("fechaCambio", this.dtoFiltro.getFechaCambio());
        }

        Map<String, String> mapOrden = new HashMap<String, String>();
        mapOrden.put("fechaCambio", "desc");
        try {
            this.lista = this.manager.obtenerConFiltroConOrden(mapFiltro, mapOrden);
        } catch (DAOException ex) {
            logger.error("ERROR DE SISTEMA", ex);
            showError(ex.getMessage());
        }
    }

    public String guardar() {
        String to = null;
        String mensajeTrx = "";

        {
            this.dto.setUsuario(sessionMBean.getSessionUsuarioDto().getId());
            this.dto.setFecha(UtilCore.Fecha.obtenerFechaActualDate());
            this.dto.setTerminal(sessionMBean.getSessionTerminal());
        }

        if (sessionMBean.getAccion() == ConstantesCore.Formulario.NUEVO) {
            try {

                this.dto.setFechaCambio(UtilCore.Fecha.obtenerFechaActualDate());
                this.dto.setUsuarioCreacion(sessionMBean.getSessionUsuarioDto().getId());
                this.dto.setFechaCreacion(UtilCore.Fecha.obtenerFechaActualDate());
                this.dto.setTerminalCreacion(sessionMBean.getSessionTerminal());
                UtilCore.General.toUpperCaseDto(this.dto);
                this.manager.nuevo(this.dto);
                mensajeTrx = UtilCore.Internacionalizacion.getMensajeInternacional("form.general.mensaje.transaccion.ok");
                showMessage(mensajeTrx);

                //to = retroceder();
            } catch (Exception ex) {
                showError(ex.getMessage());
                logger.error("ERROR DE SISTEMA", ex);
                to = null;
            }
        } else if (sessionMBean.getAccion() == ConstantesCore.Formulario.EDITAR) {
            try {
                UtilCore.General.toUpperCaseDto(this.dto);
                this.manager.editar(this.dto);
                mensajeTrx = UtilCore.Internacionalizacion.getMensajeInternacional("form.general.mensaje.transaccion.ok");
                showMessage(mensajeTrx);

              //  to = retroceder();
            } catch (Exception ex) {
                showError(ex.getStackTrace().toString());
                to = null;
            }
        }
        return to;
    }

    public void guardarDetalle() {

        boolean noExisteTc = true;
        if(this.dto.getTiposCambioDetaDto()==null){
            this.dto.setTiposCambioDetaDto(new ArrayList<TipoCambioDetaDto>());
        }
        
        for (TipoCambioDetaDto tc : this.dto.getTiposCambioDetaDto()) {
            if (tc.getMonedaCambioDto().equals(this.tipoCambioDetaDto.getMonedaCambioDto())) {
                noExisteTc = false;
            }
        }
        
        
        boolean noEsMonedaBase = true;
        if (this.monedaBaseDto.equals(this.tipoCambioDetaDto.getMonedaCambioDto())) {
            noEsMonedaBase = false;
        }
        
        if (noExisteTc && noEsMonedaBase) {
            this.dto.getTiposCambioDetaDto().add(this.tipoCambioDetaDto);
            try {
                this.tipoCambioDetaDto.setComentario("");
                this.tipoCambioDetaDto.setUsuario(sessionMBean.getSessionUsuarioDto().getId());
                this.tipoCambioDetaDto.setFecha(UtilCore.Fecha.obtenerFechaActualDate());
                this.tipoCambioDetaDto.setTerminal(sessionMBean.getSessionTerminal());
                this.tipoCambioDetaDto.setTipoCambioDto(this.dto);
                this.mngDeta.nuevo(this.tipoCambioDetaDto);
                inicializarTipoCambioDeta();
            } catch (DAOException ex) {
                logger.error(ex);
                showError(ex.getMessage());
            }
        }else if (!noExisteTc){
            showWarning(UtilCore.Internacionalizacion.getMensajeInternacional("tipo.cambio.mensaje.ya.existe"));
        }else if (!noEsMonedaBase) {
            showWarning(UtilCore.Internacionalizacion.getMensajeInternacional("tipo.cambio.mensaje.es.igual.moneda.base"));
        }

        
    }

    public String retroceder() {
        buscar(null);
        sessionMBean.setAccion(ConstantesCore.Formulario.LISTA);
        sessionMBean.setTitulo(recursosManager.construirTitulo(keyTitulo, sessionMBean.getAccion()));
        return ConstantesCore.UrlNavegacion.URL_LISTA_TIPOS_CAMBIO;
    }

    public int getAccionTipoCambio() {
        return accionTipoCambio;
    }

    public void setAccionTipoCambio(int accionTipoCambio) {
        this.accionTipoCambio = accionTipoCambio;
    }

    public ApplicationMBean getApplicationMBean() {
        return applicationMBean;
    }

    public void setApplicationMBean(ApplicationMBean applicationMBean) {
        this.applicationMBean = applicationMBean;
    }

    public TipoCambioDto getDto() {
        return dto;
    }

    public void setDto(TipoCambioDto dto) {
        this.dto = dto;
    }

    public TipoCambioDto getDtoFiltro() {
        return dtoFiltro;
    }

    public void setDtoFiltro(TipoCambioDto dtoFiltro) {
        this.dtoFiltro = dtoFiltro;
    }

    public String getKeyTitulo() {
        return keyTitulo;
    }

    public void setKeyTitulo(String keyTitulo) {
        this.keyTitulo = keyTitulo;
    }

    public List<TipoCambioDto> getLista() {
        return lista;
    }

    public void setLista(List<TipoCambioDto> lista) {
        this.lista = lista;
    }

    public List<ParametroDto> getListaMonedas() {
        this.listaMonedas = recursosManager.obtenerParametrosActivosPorCatalogo(ConstantesCore.CatalogoParametro.MONEDAS_DEL_SISTEMA);
        return listaMonedas;
    }

    public void setListaMonedas(List<ParametroDto> listaMonedas) {
        this.listaMonedas = listaMonedas;
    }

    public List<ParametroDto> getListaTipos() {
        return listaTipos;
    }

    public void setListaTipos(List<ParametroDto> listaTipos) {
        this.listaTipos = listaTipos;
    }

    public static Logger getLogger() {
        return logger;
    }

    public static void setLogger(Logger logger) {
        TipoCambioMBean.logger = logger;
    }

    public TipoCambioManager getManager() {
        return manager;
    }

    public void setManager(TipoCambioManager manager) {
        this.manager = manager;
    }

    public TipoCambioDetaManager getMngDeta() {
        return mngDeta;
    }

    public void setMngDeta(TipoCambioDetaManager mngDeta) {
        this.mngDeta = mngDeta;
    }

    public TipoCambioDetaDto getTipoCambioDetaDto() {
        return tipoCambioDetaDto;
    }

    public void setTipoCambioDetaDto(TipoCambioDetaDto tipoCambioDetaDto) {
        this.tipoCambioDetaDto = tipoCambioDetaDto;
    }

    public RecursosManager getRecursosManager() {
        return recursosManager;
    }

    public void setRecursosManager(RecursosManager recursosManager) {
        this.recursosManager = recursosManager;
    }

    public SessionMBean getSessionMBean() {
        return sessionMBean;
    }

    public void setSessionMBean(SessionMBean sessionMBean) {
        this.sessionMBean = sessionMBean;
    }

    public SelectItem[] getSiTiposCambio() {
        this.siTiposCambio = new SelectItem[2];
        this.siTiposCambio[0] = new SelectItem(ConstantesCore.ValoresDefecto.MONEDA_TIPO_VENTA, ConstantesCore.ValoresDefecto.MONEDA_TIPO_VENTA);
        this.siTiposCambio[1] = new SelectItem(ConstantesCore.ValoresDefecto.MONEDA_TIPO_COMPRA, ConstantesCore.ValoresDefecto.MONEDA_TIPO_COMPRA);
        return siTiposCambio;
    }

    public void setSiTiposCambio(SelectItem[] siTiposCambio) {
        this.siTiposCambio = siTiposCambio;
    }

    public BigDecimal getFactorConversion() {
        return factorConversion;
    }

    public void setFactorConversion(BigDecimal factorConversion) {
        this.factorConversion = factorConversion;
    }

    public ParametroDto getMonedaBaseDto() {
        return monedaBaseDto;
    }

    public void setMonedaBaseDto(ParametroDto monedaBaseDto) {
        this.monedaBaseDto = monedaBaseDto;
    }

    public ParametroDto getMonedaCambioDto() {
        return monedaCambioDto;
    }

    public void setMonedaCambioDto(ParametroDto monedaCambioDto) {
        this.monedaCambioDto = monedaCambioDto;
    }
}
